<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*==================================  面试题  ====================================*/
        // let const var 的区别？
        // 1. let/const可以形成块级作用域，var没有
        // 2. let/const不存在变量提升，var有
        // 3. let/const不允许重复声明，var可以
        // 4. let/const存在暂时性死区（temporal dead zone），不能在声明之前使用
        // 5. 浏览器中，var声明的变量在全局作用域中挂载到window对象上

        // ==> const关键字
        // 1. const声明的变量，必须马上赋值
        // 2. const声明的变量，不能改变值（简单类型不能改变值，引用数据类型不能改变地址）



        // ES6新增  ==> 2015.5月    2016.5 ==> ES7  2017.5 ==> ES8/ES2017
        // ES6 之后的 ESNext

        // 块级作用域
        // {}包裹起来的叫代码块，使用let或者const声明的变量，在`{}`中会产生块级作用域

        // 特点：
        // 1. 只有let、const会产生块级作用域 {}
        // 2. 块级作用域的外部不能访问内部的变量
        // 3. 两个块级作用域中的变量相互不影响
        // 4. if/for是语句，但是用let/const声明的变量，会在内部形成块级作用域

        /* ==================== 块级作用域 ===================== */
        {
            const obj = {
                name: 'll',
                age: 18
            }
            console.log(obj)
        }
        console.log(obj)

        /* ==================== 两个块级作用域中的变量相互不影响 ===================== */
        for (let i = 0; i < 3; i++) {
            console.log(i)
        }

        for (let i = 0; i < 3; i++) {
            console.log(i)
        }

        /* ==================== 块级作用域 ===================== */
        if (false) {
            let temp = 'hello world'
        }
        console.log(temp)

        //==> const
        let p; var c;
        const name = '马上赋值'
        // const test; // Error
    </script>
</body>

</html>